写在前面的
ECMAScript 是当前最主流的 JavaScript 语言规范,在日常的开发之中,可能完全不需要去了解规范本身的内容,但了解并理解规范本身的内容对写更好的 javascript 代码有更深远的意义。
本文将基于 ECMAScript-262 语言规范(第14版,2023年6月)的内容,从官方文档中了解自 ECMAScript 2015版(ES6) 开始引入的 Symbol 类型。
规范原文:https://262.ecma-international.org/14.0/#sec-ecmascript-language-types-symbol-type
Symbol 类型
Symbol 类型 是所有可被用于 Object 属性键的非字符串值的集合。(6.1.7)
每一个可能的 Symbol 值都是唯一的,并且不可变的。
每一个 Symbol 值不可变拥有一个相关联被称为 [[Description]]
的值,该值是 undefined 或一个字符串。
知名的 Symbols
知名的 Symbols 是由 ECMAScript 规范的算法明确引用的内置 Symbol 值。它们通常被用作属性的键,其值作为规范的算法扩展点。除非另有说明,否则这些知名的 symbols 值由所有的 realms (9.3) 所共享。
在本篇规范中,知名的 symbols 使用 @@name
的形式进行表示,“name” 的值是 表1 中所列出的其中之一。
表 1:知名的 Symbols
规范名称 | [[Decription]] | 值和目的 |
---|---|---|
@@asyncIterator | "Symbol.asyncIterator" | 一个从对象中返回默认的 AsyncIterator 的方法。由 for-await-of 语句调用。 |
@@hasInstance | "Symbol.hasInstance" | 一个用于确定 构造函数 对象是否将对象识别为 构造函数 的实例之一的方法。由 instanceof 运算符调用。 |
@@isConcatSpreadable | "Symbol.isConcatSpreadable" | 一个布尔值属性,如果为 true 表明对象应该通过 Array.prototype.concat 扁平化到它的数组元素 |
@@iterator | "Symbol.iterator" | 一个为对象返回默认迭代器的方法。由 for-of 语句调用。 |
@@match | "Symbol.match" | 一个将正则表达式与字符串匹配的正则表达式方法。由 String.prototype.match 方法调用。 |
@@matchAll | "Symbol.matchAll" | 一个返回迭代器的正则表达式方法,用于生成正则表达式与字符串的匹配项。由 String.prototype.matchAll 方法调用。 |
@@replace | "Symbol.replace" | 一个用于替换与正则表达式匹配字符串的子串的正则表达式方法。由 String.prototype.replace 方法调用。 |
@@search | "Symbol.search" | 一个返回与正则表达式匹配的索引值的正则表达式方法。由 String.prototype.search 方法调用。 |
@@species | "Symbol.species" | 一个函数值属性,该属性是用于创建派生对象的构造函数。 |
@@split | "Symbol.split" | 一个正则表达式方法用于在与正则表达式匹配的索引处拆分字符串。由 String.prototype.split 方法调用。 |
@@toPrimitive | "Symbol.toPrimitive" | 一个将对象转化为原始值的方法。由 ToPrimitive 抽象操作调用。 |
@@toStringTag | "Symbol.toStringTag" | 一个被用于为对象创建默认字符串描述的字符串值属性。由内置的 Object.prototype.toString 方法访问。 |
@@unscopables | "Symbol.unscopables" | 一个对象值属性,其自己的属性名称和继承的属性名称是从关联对象的 与 环境绑定中排除的属性名称。 |
写在后面的
关于 realms 可以参考 Stack Overflow 上面的一篇讨论 如何理解js的realms。